/**
 * Copyright (c) 2015-2017, Henry Yang 杨勇 (gismail@foxmail.com).
 * <p>
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * <p>
 * http://www.apache.org/licenses/LICENSE-2.0
 * <p>
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.lambkit.module.cms.rpc.api;

import java.io.IOException;
import java.util.List;

import com.jfinal.plugin.activerecord.Page;
import com.jfinal.plugin.activerecord.Record;
import com.lambkit.common.service.LambkitService;
import com.lambkit.module.cms.rpc.model.CmsFile;
import com.lambkit.module.cms.rpc.model.CmsRelation;

/**
 * @author yangyong 
 * @website: www.lambkit.com
 * @email: gismail@foxmail.com
 * @date 2020-02-23
 * @version 1.0
 * @since 1.0
 */
public interface CmsFileService extends LambkitService<CmsFile> {
	/**
	 * 插入一个新的文件信息到数据库
	 * 
	 * @param fileInfo
	 * @return
	 */
	int insertFile(CmsFile fileInfo);

	/**
	 * 解压用户上传的文件，并保存到磁盘和数据库
	 * 
	 * @param string
	 * @param user
	 * @return 解压之后的文件uuid
	 */
	List<String> compressFile(String name, Long userid) throws Exception;

	/**
	 * 转化一个文件
	 * 
	 * @param uuid
	 */
	void translateFile(String uuid) throws IOException;

	/**
	 * 根据uuid查找一个文件
	 * 
	 * @param uuid
	 * @return
	 */
	CmsFile getByUuid(String uuid);

	/**
	 * 根据fileId查找一个文件
	 * 
	 * @param uuid
	 * @return
	 */
	CmsFile getByFileId(Long fileId);

	/**
	 * 根据uuid保存一个文件的基本信息
	 * 
	 * @param uuid
	 * @return
	 */
	int saveByUuid(CmsFile fileInfo);
	
	/**
	 * 修改文件的基本信息
	 * 
	 * @param fileInfo
	 * @return
	 */
	int updateByUuid(CmsFile file);

	/**
	 * 设置文件的状态
	 * 
	 * @param uuid
	 * @param i
	 */
	void setFileStateByUuid(String uuid, int i);
	
	/**
	 * 修改文件后缀名
	 * 
	 * @param fileId
	 * @param fileExe
	 */
	void modifyFileExtById(Long fileId, String fileExt);
	
	/**
	 * 查询一个用户可用的文档
	 * 
	 * @param searchInfo
	 * @param userId
	 * @param pageNo
	 * @return
	 */
	Page<CmsFile> searchByNameOrId(String searchInfo, Long userId, Integer pageNo, int pageSize);

	/**
	 * 删除文档记录及文件
	 * @param fileId
	 * @return
	 * @throws Exception
	 */
	public int delFileById(Long fileId) throws Exception;
	/**
	 * 给一篇文档添加关联
	 * 
	 * @param mainFileId
	 * @param list
	 * @return
	 */
	int addRelations(Long mainFileId, List<Long> list);

	/**
	 * 搜索可用文件
	 * 
	 * @param searchInfo
	 * @param userId
	 * @return
	 */
	List<CmsFile> searchByNameOrId(String searchInfo, Long userId);
	
	/**
	 * 得到关联文档
	 * 
	 * @param mainFileId
	 * @return
	 */
	List<CmsRelation> getRelations(Long mainFileId);

	/**
	 * 删除关联文档
	 * 
	 * @param mainFileId
	 * @param relationFileId
	 * @return
	 */
	int delRelations(Long mainFileId, Long relationFileId);

	/**
	 * 自动关联
	 * @param uuid
	 */
	int autoRelation(String uuid);

	/**
	 * 得到为处理过的文件
	 * 
	 * @param i
	 * @return
	 */
	List<CmsFile> getFilesByState(int i);
	
	/**
	 * 得到所有文档
	 * 
	 * @param string
	 * @return
	 */
	Page<CmsFile> getFiles(String searchValue, int pageNo, int pageSize, String order);

	/**
	 * 得到未处理过的文件
	 * 
	 * @param searchValue
	 * 
	 * @param i
	 * @return
	 */
	//Page<CmsFile> getFilesByUserId(Long userId, String searchValue, int pageNo, String order);

	/**
	 * 得到一个子节点所有的共有文件
	 * 
	 * @param searchValue
	 * 
	 * @param i
	 * @return
	 */
	//Page<CmsFile> getAllChildFiles(List<Long> ids, int pageNo, String order);
	
	/**
	 * 得到用户浏览历史
	 * 
	 * @param userId
	 * @return
	 */
	//List<CmsFile> getRecentByUserId(Long userId);

	/**
	 * 得到最近记录
	 * 
	 * @return
	 */
	//List<CmsFile> getRecentShare();

	/**
	 * 获得近期点击率最高的文档
	 * 
	 * @param date
	 * @param date2
	 * @return
	 */
	//List<CmsFile> getRecentHotFile();

	/**
	 * 得到用户最近发布的文件和笔记
	 * @param userId
	 * @return
	 */
	Page<Record> getRecentFileAndNote(int pageNumber, int pageSize, Long userId);

	/**
	 * 获取共享的某一目录及其子目录的所有文件
	 * @param pageNumber
	 * @param pageSize
	 * @param categoryId
	 * @return
	 */
	Page<Record> getPublishByCategory(int pageNumber, int pageSize, Long categoryId, String title, String tags);
	/**
	 * 获取共享的某一目录的所有文件
	 * @param userId
	 * @return
	 */
	Page<Record> getPublishOnCategory(int pageNumber, int pageSize, Long categoryId, String title, String tags);
	/**
	 * 移动文件
	 * @param cid
	 * @param pid
	 * @param ids
	 * @return
	 */
	int moveFile(Long cataLogId, Long targetId, String ids);
	
	
	/**
	 * 相关文件
	 * @param articleId
	 * @param statusNormal
	 * @param count
	 * @return
	 */
	List<CmsFile> findTagRelevantListByFileId(Long fileId, Integer count);
	/**
	 * 某标签的文件
	 * @param tagId
	 * @param hasThumbnail
	 * @param orderBy
	 * @param count
	 * @return
	 */
	List<CmsFile> findListByTagId(Long tagId, String orderBy, Integer count);
	Page<CmsFile> paginateByTagId(Integer pageNumber, Integer pageSize, Long tagId);
	
	List<CmsFile> findListByTag(String tag, String orderBy, Integer count);
	Page<CmsFile> paginateByTag(Integer pageNumber, Integer pageSize, String tag);
	Page<CmsFile> paginateByUserTag(Integer pageNumber, Integer pageSize, Long userId, String tag);
}
